/*******************************************************************
 * @Warning      : Without permission from the author,Not for commercial use
 * @File         :
 * @Author       : xiaowine
 * @Date         : 2020-09-02 10:32:56
 * @version      : v01.00
 * @ **************************************************************
 * @LastEditTime : 2020-09-05 21:01:30
 * @LastEditors  : xiaowine
 * @ **************************************************************
 * @brief        :
 * @Description  :
 * @FilePath     : \T5L_C51_PRJ\FUNC_HANDLER\control.c
 * @ **************************************************************
 * @attention    :
 * @Powered By xiaowine
 * @<h2><center>&copy;  Copyright(C) cee0.com 2020</center></h2>
 * @All rights reserved
 ******************************************************************/

#include "control.h"
#include "dgus.h"
#include "timer.h"
#include "temperature.h"
#include "rtc.h"
#include "string.h"
#include "config.h"

//读写Nor Flash命令
const u8 read_flash[8]  = {0x5A, 0x00, 0x00, 0x00, 0x25, 0xE0, 0x01, 0x20};
const u8 write_flash[8] = {0xA5, 0x00, 0x00, 0x00, 0x25, 0xE0, 0x01, 0x20};
//读写Nor Flash后查询状态
u8 read_flash_status[8] = {0};
const u8 Soft_Ver[]     = "V2.1";
//魔数，nor flash读取标志位
u16 Magic_Number = 0;
//闹钟开关
u16 Alarm_Key[2] = {0};
//定时器123开启标志位
u16 timer_key[3] = {0};
//定时器开关选择
u16 tim_k = 0;
//时分
u16 Hour_Min_R = 0;
//定时器123触发标志
u8 timer_trigger_flag[3] = {0};
//背光调节数组
u16 led_new = 0;
//闹钟时间铃声
alarm alarm_val;
//屏保时间，类型
u16 sleep_time = 0;
u16 Sleep_Type = 1;
//云变量定时器星期值
u16 tim_week_c[3] = {0};
//定时器123定时星期
u16 timer_week[3][7] = {0};
//定时器时段风速模式数据保存
timer_period tim_per_val[3][4] = {0};
//温控器状态
u16 TC_Status     = 0;
u16 TC_Status_Old = 0;
//远程更新
u16 Remote_Update_Status = 0;
//信息控件清空
u16 Message_Val = 0xFFFF;
//密码
u32 Password = 0;
//当前页面
u16 PageNow = 0;
//屏保参数
u16 Screen_Saver_Parm[3] = 0;
//人体接近感应功能
u16 ALS_Function = 0;
/*****************************************************************************
 函 数 名  : void System_Parm_Init(void)
 功能描述  : 系统参数初始化，读取保存Nor Flash区域和22.bin文件系统参数，并配置软件
            版本号等参数。
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年5月16日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void System_Parm_Init(void)
{
    Read_Nor_Flash();  //读Nor Flash
    DelayMs(5);
    read_dgus_vp(MAGIC_NUMBER, (u8 *)&Magic_Number, 1);
    if (Magic_Number != 0x5AA5)
    {
        Magic_Number = 0x5AA5;
        write_dgus_vp(MAGIC_NUMBER, (u8 *)&Magic_Number, 1);
        Parm_Reset_Init();
        Write_Nor_Flash();
        DelayMs(5);
    }
    write_dgus_vp(SOFT_VER_ADDR, (u8 *)Soft_Ver, (sizeof(Soft_Ver) / 2 + 1));  //写软件版本
    TC_Status = 1;
    write_dgus_vp(SWITCH, (u8 *)&TC_Status, 1);  //写入温控器状态
    // leaveHomeEventHandl();
    Remote_Update_Status = 0;
    write_dgus_vp(REMOTE_UPDATE, (u8 *)&Remote_Update_Status, 1);  //远程更新无
    read_dgus_vp(PASSWORD_ADDR, (u8 *)&Password, 2);               //读温度设置数
    if (Password == 0)
    {
        Password = 666666;
    }
    read_dgus_vp(TEMPERATURE_PRECISION, (u8 *)&Temperature_Precision, 1);  //读温度设置数
    // read_dgus_vp(TEMP_SET, (u8*)&Temperature_Set_Val, 1);
    // Set_Temper_Display_Val     = Temperature_Set_Val / 10;
    // Set_Temper_Display_Val_Dec = Temperature_Set_Val % 10;
    // write_dgus_vp(SET_TEMP_VALUE, (u8*)&Set_Temper_Display_Val, 1);
    // write_dgus_vp(SET_TEMP_VAL_DEC, (u8*)&Set_Temper_Display_Val_Dec, 1);  //写温度设置值
    if ((Temperature_Precision != 0) && (Temperature_Precision != 1))
    {
        Temperature_Precision = 1;
    }
    if (Temperature_Precision == 0)
    {
        Temp_Pre = 5;  //方便测试，后续修改为5
    }
    else if (Temperature_Precision == 1)
    {
        Temp_Pre = 10;
    }
    read_dgus_vp(TEMPERATURE_UPPER, (u8 *)&Temperature_Upper, 1);  //读温度设置上下限
    read_dgus_vp(TEMPERATURE_LOWER, (u8 *)&Temperature_Lower, 1);
    if ((Temperature_Upper == 0) || (Temperature_Lower == 0) || (Temperature_Upper <= Temperature_Lower))
    {
        Temperature_Upper = 320;
        Temperature_Lower = 160;
    }
    read_dgus_vp(TEMPERATURE_COEFFICIENT, (u8 *)Temp_Coef, 3);  //读温度系数
    if ((Temp_Coef[0] <= 0) || (Temp_Coef[1] <= 0) || (Temp_Coef[0] != Temp_Coef[1] + 10))
    {
        Temp_Coef[0] = 10;
        Temp_Coef[1] = 0;
        Temp_Coef[2] = -600;
    }
    // read_dgus_vp(CHANGE_PAGE, (u8*)Page_Change, 10);        //读取切换页面参数
    read_dgus_vp(SCREEN_SAVER, (u8 *)Screen_Saver_Parm, 3);  //读取屏保页面参数
    read_dgus_vp(ALS, (u8 *)&ALS_Function, 1);               //是否有人体接近感应功能
    Message_Val = 0xFFFF;
    write_dgus_vp(MESSAGE_DATA, (u8 *)&Message_Val, 1);
    read_dgus_vp(TIMER1_WEEK, (u8 *)&tim_week_c[0], 1);
    read_dgus_vp(TIMER1_TIME_SEED_MODE, (u8 *)&tim_per_val[0][0], 16);
    Week_Val(0);
    read_dgus_vp(TIMER2_WEEK, (u8 *)&tim_week_c[1], 1);
    read_dgus_vp(TIMER2_TIME_SEED_MODE, (u8 *)&tim_per_val[1][0], 16);
    Week_Val(1);
    read_dgus_vp(TIMER3_WEEK, (u8 *)&tim_week_c[2], 1);
    read_dgus_vp(TIMER3_TIME_SEED_MODE, (u8 *)&tim_per_val[2][0], 16);
    Week_Val(2);
    RTC_init();
    // 	P8563_init();							//时间初始化，防止出现不正确的时间
    // Temperature_To_Set_Flag = 0;  //初始化值
    // Wind_Speed_Config_Flag  = 0;  //风速设置
    // Mode_Config_Flag        = 0;  //模式设置
    // Close_Valve_Flag        = 0;  //开继电器
    // Power_Flag              = 0;
    TC_Status        = 2;
    Temp_time        = 200;
    Temp_Freq        = 10;
    Temperature_Real = 260;
    write_dgus_vp(TEMP_CURRENT, (u8 *)&Temperature_Real, 1);
    Temperatrue_Real_Old = Temperature_Real;
    read_dgus_vp(PIC_NOW, (u8 *)&PageNow, 1);
    // if (PageNow == 27)
    // {
    //     Return_Main_page();
    // }

    // movie_icon = 1;
    // write_dgus_vp(0x2702, (u8*)&movie_icon, 1);  //首页动图
}
/*****************************************************************************
 函 数 名  : void Parm_Reset_Init(void)
 功能描述  : 参数设置初始化
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年4月26日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Parm_Reset_Init(void)
{
    // Wind_Speed = 4;
    // write_dgus_vp(SPEED, (u8*)&Wind_Speed, 1);  //风速
    // Mode = 3;
    // write_dgus_vp(MODE, (u8*)&Mode, 1);  //模式
    // movie_icon = 1;
    // write_dgus_vp(0x2702, (u8*)&movie_icon, 1);  //首页动图
    Alarm_Key[0] = 0;
    Alarm_Key[1] = 0;
    write_dgus_vp(ALARM_KEY, (u8 *)Alarm_Key, 2);  //闹钟开关
    timer_key[0] = 0;
    timer_key[1] = 0;
    timer_key[2] = 0;
    write_dgus_vp(TIMER_KEY, (u8 *)timer_key, 3);  //定时器开关
    leaveHomeEventHandl();
    // Temperature_Set_Val = 260;
    // write_dgus_vp(TEMP_SET, (u8*)&Temperature_Set_Val, 1);  //设定温度
    Temperature_Precision = 1;
    write_dgus_vp(TEMPERATURE_PRECISION, (u8 *)&Temperature_Precision, 1);  //读温度设置数

    led_new = 0x50;
    write_dgus_vp(SCREEN_BRIGHTNESS, (u8 *)&led_new, 1);  //屏幕亮度
    alarm_val.alarm1_time = 0;
    alarm_val.alarm2_time = 0;
    alarm_val.alarm1_ring = 1;
    alarm_val.alarm2_ring = 1;
    write_dgus_vp(ALARM_VAL, (u8 *)&alarm_val, 4);  //闹钟时间铃声
    Sleep_Type = 1;
    write_dgus_vp(SCREEN_SAVER_TYPE, (u8 *)&Sleep_Type, 1);
    sleep_time = 1;
    write_dgus_vp(SCREEN_SAVER_TIME, (u8 *)&sleep_time, 1);
    memset(&tim_week_c[0], 0, sizeof(tim_week_c));
    tim_per_val[0][0].timer_time_start = 0x081E;
    tim_per_val[0][0].timer_time_end   = 0x0C00;
    tim_per_val[0][0].timer_speed      = 1;
    tim_per_val[0][0].timer_switch     = 0;
    tim_per_val[0][1].timer_time_start = 0x0C00;
    tim_per_val[0][1].timer_time_end   = 0x0D00;
    tim_per_val[0][1].timer_speed      = 1;
    tim_per_val[0][1].timer_switch     = 0;
    tim_per_val[0][2].timer_time_start = 0x0D00;
    tim_per_val[0][2].timer_time_end   = 0x1200;
    tim_per_val[0][2].timer_speed      = 1;
    tim_per_val[0][2].timer_switch     = 0;
    tim_per_val[0][3].timer_time_start = 0x1200;
    tim_per_val[0][3].timer_time_end   = 0x0C00;
    tim_per_val[0][3].timer_speed      = 1;
    tim_per_val[0][3].timer_switch     = 0;
    write_dgus_vp(TIMER1_WEEK, (u8 *)&tim_week_c[0], 1);
    write_dgus_vp(TIMER1_TIME_SEED_MODE, (u8 *)&tim_per_val[0][0], 16);
    tim_per_val[1][0].timer_time_start = 0x081E;
    tim_per_val[1][0].timer_time_end   = 0x0C00;
    tim_per_val[1][0].timer_speed      = 1;
    tim_per_val[1][0].timer_switch     = 0;
    tim_per_val[1][1].timer_time_start = 0x0C00;
    tim_per_val[1][1].timer_time_end   = 0x0D00;
    tim_per_val[1][1].timer_speed      = 1;
    tim_per_val[1][1].timer_switch     = 0;
    tim_per_val[1][2].timer_time_start = 0x0D00;
    tim_per_val[1][2].timer_time_end   = 0x1200;
    tim_per_val[1][2].timer_speed      = 1;
    tim_per_val[1][2].timer_switch     = 0;
    tim_per_val[1][3].timer_time_start = 0x1200;
    tim_per_val[1][3].timer_time_end   = 0x0C00;
    tim_per_val[1][3].timer_speed      = 1;
    tim_per_val[1][3].timer_switch     = 0;
    write_dgus_vp(TIMER2_WEEK, (u8 *)&tim_week_c[1], 1);
    write_dgus_vp(TIMER2_TIME_SEED_MODE, (u8 *)&tim_per_val[1][0], 16);
    tim_per_val[2][0].timer_time_start = 0x081E;
    tim_per_val[2][0].timer_time_end   = 0x0C00;
    tim_per_val[2][0].timer_speed      = 1;
    tim_per_val[2][0].timer_switch     = 0;
    tim_per_val[2][1].timer_time_start = 0x0C00;
    tim_per_val[2][1].timer_time_end   = 0x0D00;
    tim_per_val[2][1].timer_speed      = 1;
    tim_per_val[2][1].timer_switch     = 0;
    tim_per_val[2][2].timer_time_start = 0x0D00;
    tim_per_val[2][2].timer_time_end   = 0x1200;
    tim_per_val[2][2].timer_speed      = 1;
    tim_per_val[2][2].timer_switch     = 0;
    tim_per_val[2][3].timer_time_start = 0x1200;
    tim_per_val[2][3].timer_time_end   = 0x0C00;
    tim_per_val[2][3].timer_speed      = 1;
    tim_per_val[2][3].timer_switch     = 0;
    write_dgus_vp(TIMER3_WEEK, (u8 *)&tim_week_c[2], 1);
    write_dgus_vp(TIMER3_TIME_SEED_MODE, (u8 *)&tim_per_val[2][0], 16);
}

void touchHandler(void)
{
}

/*****************************************************************************
 函 数 名  : void Read_Nor_Flash(void)
 功能描述  : 读nor flash系统参数，固定为25E0-26FF的值
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年5月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Read_Nor_Flash(void)
{
    write_dgus_vp(NOR_FLASH, (u8 *)read_flash, 4);
    do
    {
        DelayMs(5);
        read_dgus_vp(NOR_FLASH, (u8 *)read_flash_status, 4);
    } while (read_flash_status[0] != 0);
}

/*****************************************************************************
 函 数 名  : void Write_Nor_Flash(void)
 功能描述  : 写nor flash系统参数，固定为25E0-26FF的值
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年5月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Write_Nor_Flash(void)
{
    write_dgus_vp(NOR_FLASH, (u8 *)write_flash, 4);
    do
    {
        DelayMs(5);
        read_dgus_vp(NOR_FLASH, (u8 *)read_flash_status, 4);
    } while (read_flash_status[0] != 0);
}
/*****************************************************************************
 函 数 名  : void Control_Function(void)
 功能描述  : 温控器控制函数
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年4月30日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Control_Function(void)
{
    // Key_Handler();                          //按键处理
    // Display_Temperature();                  //显示实时温度和设定温度
    // ModePage_Set();                         //模式及页面处理
    Get_Temperature(Temp_time, Temp_Freq);  //得到实时温度
    Timer_Config_Handler();                 //定时器处理
    // if ((Close_Valve_Flag & 0x01) == 0x01)  //休眠状态不能进行亮度处理
    // {
    //     Close_Valve();  //关闭继电器
    // }
    // else
    // {
    //     Mode_Wind_Speed_Handler();  //温度风速控制
    //     Brightness_Handler();       //亮度处理
    // }
    Alarm_Handler();  //闹钟处理	T5L暂时没有闹钟功能
    // Sleep_Handler();            //休眠处理
    // TC_Status_Check_Handler();  //检查温控器状态是否休眠
    controlSwitch();
    touchHandler();
}

void controlSwitch(void)
{
    if (MS100msFlag)
    {
        u16 cache = {0};
        read_dgus_vp(SWITCH_OUTPUT, (u8 *)&cache, 1);
        if (cache & 1)
        {
            switch_output0 = 1;
        }
        else
        {
            switch_output0 = 0;
        }

        if (cache & 2)
        {
            switch_output1 = 1;
        }
        else
        {
            switch_output1 = 0;
        }

        if (cache & 4)
        {
            switch_output2 = 1;
        }
        else
        {
            switch_output2 = 0;
        }

        if (cache & 8)
        {
            switch_output3 = 1;
        }
        else
        {
            switch_output3 = 0;
        }
    }
}

void atHomeEventHandl(void)
{
    u16 cache = 0x0f;
    write_dgus_vp(SWITCH_OUTPUT, (u8 *)&cache, 1);
}
void leaveHomeEventHandl(void)
{
    u16 cache = 0;
    write_dgus_vp(SWITCH_OUTPUT, (u8 *)&cache, 1);
}

/*****************************************************************************
 函 数 名  : void Timer_Config_Handler(void)
 功能描述  : 定时器配置处理，根据定时器设置参数，处理定时器配置参数
 输入参数  :
 输出参数  :
 修改历史  :
  1.日    期   : 2019年5月15日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
void Timer_Config_Handler(void)
{
    u8 i = 0;
    u16 Timer_Status;
    if (!MS500msFlag)
        return;
    read_dgus_vp(TIMER_KEY, (u8 *)timer_key, 3);
    if ((timer_key[0] > 0) || (timer_key[1] > 0) || (timer_key[2] > 0))
    {
        for (tim_k = 0; tim_k < 3; tim_k++)
        {
            if (timer_key[tim_k] == 1)
            {
                if (timer_week[tim_k][real_time.week] == 1)  //星期有处于设置状态
                {
                    Hour_Min_R = (u16)real_time.hour * 256 + real_time.min;
                    for (i = 0; i < 4; i++)
                    {
                        if (tim_per_val[tim_k][i].timer_time_start == tim_per_val[tim_k][i].timer_time_end)
                        {
                            return;
                        }
                        else
                        {
                            if (Hour_Min_R == tim_per_val[tim_k][i].timer_time_start)
                            {
                                if (timer_trigger_flag[tim_k] != i + 1)
                                {
                                    write_dgus_vp(SWITCH_OUTPUT, (u8 *)&tim_per_val[tim_k][i].timer_switch, 1);
                                    timer_trigger_flag[tim_k] = i + 1;
                                }
                            }
                        }
                    }
                }
            }
        }
        Timer_Status = 1;
        write_dgus_vp(TIMER_STATUS, (u8 *)&Timer_Status, 1);
    }
    else
    {
        Timer_Status = 0;
        write_dgus_vp(TIMER_STATUS, (u8 *)&Timer_Status, 1);
    }
    return;
}

/*****************************************************************************
 函 数 名  : u8 Alarm_Handler(void)
 功能描述  : 闹钟处理函数
 输入参数  :
 输出参数  : 0：闹钟处理函数成功
 修改历史  :
  1.日    期   : 2019年4月2日
    作    者   : chengjing
    修改内容   : 创建
*****************************************************************************/
u8 Alarm_Handler(void)
{
    u16 Real_Hour_Min = 0, Alarm_Status;
    if (!MS500msFlag)
        return 0;
    read_dgus_vp(ALARM_KEY, (u8 *)Alarm_Key, 2);
    if ((Alarm_Key[0] > 0) || (Alarm_Key[1] > 0))
    {
        read_dgus_vp(ALARM_VAL, (u8 *)&alarm_val, 4);
        Real_Hour_Min = (u16)real_time.hour * 256 + real_time.min;
        if (Alarm_Key[0] == 1)
        {
            if (Real_Hour_Min == alarm_val.alarm1_time)
            {
                //开启闹钟，gui闹钟还没有调通，后续增加
            }
            else
            {
                // flag清零
            }
        }
        else if (Alarm_Key[1] == 1)
        {
            if (Real_Hour_Min == alarm_val.alarm2_time)
            {
                //开启闹钟，gui闹钟还没有调通，后续增加
            }
            else
            {
                // flag清零
            }
        }
        Alarm_Status = 1;
        write_dgus_vp(ALARM_STATUS, (u8 *)&Alarm_Status, 1);
    }
    else
    {
        Alarm_Status = 0;
        write_dgus_vp(ALARM_STATUS, (u8 *)&Alarm_Status, 1);
    }
    return 0;
}
